<?php

/**
 * 请求系统模块
 * Date: 2020/03/04
 */

namespace Lib\Paas;

use Lib\Base\Validate;

class SystemModule extends Base
{
    public function __construct($sData = [])
    {
        parent::__construct($sData);
    }

    /**
     * 调用系统模块
     * @param string $moduleKey 要调用的模块的key(每个模块的key都是唯一的)，具体参考模块说明文档
     * @param string $functionKey 要调用的模块中的功能的key(同一模块中的不同功能key唯一)，具体参考模块说明文档
     * @param int $instanceId 实例ID，活动配置中添加模块之后生成的实例ID
     * @param array $userParam 模块需要参数信息，key=>value数组，key:参数名称，value：参数值，其中key不能为“ulink_modInfo”，具体参考模块说明文档

     * @return array
     * [
     *      'iRet' => '接口是否调用成功，需要iRet和data中返回值一起判断',
     *      'sMsg' => '系统消息',
     *      'sAmsSerial' => '流水号',
     *      'data' => [],   //接口返回结果集数组
     * ]
     */
    public function getData(string $moduleKey, string $functionKey, int $instanceId, array $userParam = []): array
    {
        if ($moduleKey == '') {
            return $this->getRetData('-1', '模块key不能为空！');
        }

        if ($functionKey == '') {
            return $this->getRetData('-2', '模块功能key不能为空！');
        }

        if (!empty($userParam) && isset($userParam['ulink_modInfo'])) {
            return $this->getRetData('-3', '用户参数名称不能包含ulink_modInfo（系统保留参数）。');
        }

        if (!Validate::checkNaturalNum($instanceId)) {
            return $this->getRetData('-4', '模块ID必须为正整数！');
        }

        $moduleParam = [
            'ulink_modInfo' => [
                'modkey' => $moduleKey,
                'cgikey' => $functionKey,
                'instance' => $instanceId
            ]
        ];
        $moduleParam = array_merge($moduleParam, $userParam);
        $url = $this->getPaasRequestUrl('module.query');

        $res = $this->http->post($url, http_build_query($moduleParam));

        recordLog('请求自系统自定义模块返回值：' . var_export($res, true), __FILE__, __LINE__);

        if ($res['ret'] != 0) {
            $this->tglogReport('框架请求ULink-Paas出现异常，curl_errno：' . $res['ret'] . '，curl_error：' . $res['msg'], 'module.query');
            return $this->getRetData(CURL_ERROR_NO, '系统繁忙，请稍后再试！');
        }
        $res = $res['data'];

        if ($res['ret'] != 0) {
            return $this->getRetData($res['ret'], '系统繁忙，请稍后再试！');
        } else {
            return $this->getRetData('0', 'success', ['data' => $res['data']]);
        }
    }
}
